﻿/**
 * Array相关操作
 * @namespace Array
 * @name core.Array
 * @static
 */
core.Array = {
  /**
   * 从数组中移除指定的元素
   * @function
   * @name core.Array.remove
   * @grammar core.Array.remove(source, value)
   * @param {Array} source 需要操作的数组
   * @param {String|Number|Boolean} value 要移除的元素
   * @remark 该操作会直接操作源数组
   *
   * @return {Array} 移除后的数组
   */
  remove: function (source, value) {
    for (var i = 0; i < source.length; i++) {
      if (source[i] === value) {
        source.splice(i, 1);
        break;
      }
    }
    return source;
  },
  /**
   * 从数组中移除指定位置的元素
   * @function
   * @name core.Array.removeAt
   * @grammar core.Array.removeAt(source, index)
   * @param {Array} source 需要移除项的数组
   * @param {Number} index 要移除项的索引位置
   * @remark 该操作会直接操作源数组
   *
   * @return {Array} 移除后的数组
   */
  removeAt: function (source, index) {
    return source.splice(index, 1)[0];
  },
  /**
   * 清空一个数组
   * @function
   * @name core.Array.empty
   * @grammar core.Array.empty()
   * @remark 该操作会直接操作源数组
   */
  empty: function (source) {
    source.length = 0;
  },
  /**
   * 过滤数组中的相同项。如果两个元素相同，会删除后一个元素。
   * @function
   * @name core.Array.unique
   * @grammar core.Array.unique(source[, compareFn])
   * @param {Array} source 需要过滤的数组
   * @param {Function} compareFn 比较函数
   * @remark 该操作不会直接操作源数组
   *
   * @return {Array} 过滤后的新数组
   */
  unique: function (source, compareFn) {
    var len = source.length, result = source.slice(0), i, datum;
    if ('function' != typeof compareFn) {
      compareFn = function (item1, item2) {
        return item1 === item2;
      };
    }
    // 从后往前双重循环比较，如果两个元素相同，删除后一个
    while (--len > 0) {
      datum = result[len];
      i = len;
      while (i--) {
        if (compareFn(datum, result[i])) {
          result.splice(len, 1);
          break;
        }
      }
    }
    return result;
  }
};
